package com.itheima.api.treemap.demo03;

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo01 {

    /**
     * 需求："aababcabcdabcde",获取字符串中每一个字符出现的次数；要求结果:a(5)b(4)c(3)d(2)e(1)
     *
     * 分析：我们发现这个结果存在一个对应关系
     *
     * 字符   次数
     * a      5
     * b      4
     * c      3
     * ...
     *
     * 依然存在这样的对应关系，那么我们就可以使用一个Map来存在这些数据，而由于Map是一个接口，那么我们在使用的时候不能直接new ， 我们可以选定
     * Map的子类， 而我们发现结果是一个有序的结果，因为我们可以使用TreeMap； 假设现在一个存在了一个TreeMap集合对象，其中的元素就是上面的数据
     * 那么我们可不可以得到： a(5)b(4)c(3)d(2)e(1) 字符串；可以； 就是需要去遍历我们这个TreeMap集合对象，然后获取对应的元素，按照指定的
     * 规则进行字符串的拼接操作(StringBuilder)
     *
     * 现在我们的已知条件是我们有一个字符串："aababcabcdabcde" ，那么我们只需要将这个字符串中的每一个字符串，按照上述的要求存储到TreeMap集合对象中
     * 即可; 那么这个TreeMap集合对象中的键是什么？ 每一个字符(char) ， 值是什么？就是出现次数(int) 那么我们所创建的TreeMap集合对象
     * TreeMap<Character , Integer>  ;  从字符串中获取每一个字符，然后将其存储到TreeMap ； 从字符串中获取每一个字符，那么我们就涉及到对字符串的
     * 遍历；怎么遍历字符串呢？ charAt(int index)  ;
     *
     * 遍历字符串的另外一个思路: 把这个字符串转换成字符数组，然后在遍历字符串
     * public char[] toCharArray​()将此字符串转换为新的字符数组。
     *
     * 字符出现的次数怎么记录？ 使用当前遍历的字符从TreeMap中查找对应的值 ， 要么存在，要么不存在。 如果不存在，就把当前字符串存储到TreeMap中，值是1
     * 要么存在，就对值进行+1操作，把+1以后的结果存储到TreeMap中
     *
     */
    public static void main(String[] args) {

        /**
         * 1. 定义字符串"aababcabcdabcde"
         * 2. 将字符串转换成一个字符数组
         * 3. 创建TreeMap集合对象(键：Character ， 值：Integer)
         * 4. 遍历字符数组，获取每一个元素，然后根据这个字符从TreeMap集合中获取指定的值
         * 5. 如果值为null，说明TreeMap集合对象中没有这个键，那么就将这个字符存储到集合中，值为1
         * 6. 如果值不为null，对值进行+1操作，然后再将这个值存储到集合中
         * 7. 创建一个StringBuilder对象
         * 8. 遍历集合按照结果要求拼接字符串
         * 9. 把StringBuilder对象转换成字符串在控制台进行输出
         */
        // 定义字符串"aababcabcdabcde"
        String s = "aababcabcdabcde" ;

        // 将字符串转换成一个字符数组; public char[] toCharArray​()将此字符串转换为新的字符数组。
        char[] chs = s.toCharArray() ;

        // 创建TreeMap集合对象(键：Character ， 值：Integer)
        TreeMap<Character , Integer> treeMap = new TreeMap<Character , Integer>() ;

        // 遍历字符数组，然后根据这个字符从TreeMap集合中获取指定的值
        for(int x = 0 ; x < chs.length ; x++) {

            // 获取每一个元素
            char ch = chs[x] ;

            // 然后根据这个字符从TreeMap集合中获取指定的值
            Integer integer = treeMap.get(ch);

            // 如果值为null
            if(integer == null) {

                // 那么就将这个字符存储到集合中，值为1
                treeMap.put(ch , 1) ;

            }else {
                integer = integer + 1 ;
                treeMap.put(ch , integer) ;
            }

        }

        // 创建一个StringBuilder对象
        StringBuilder sb = new StringBuilder() ;

        // 遍历集合按照结果要求拼接字符串
        // a(5)b(4)c(3)d(2)e(1)
        Set<Map.Entry<Character, Integer>> entrySet = treeMap.entrySet();
        for(Map.Entry<Character, Integer> en : entrySet) {
            sb.append(en.getKey()).append("(").append(en.getValue()).append(")") ;
        }

        // 把StringBuilder对象转换成字符串在控制台进行输出
        String result = sb.toString();
        System.out.println(result);

    }

}
















